package com.liyong.pullorder.sdk.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * @author 葡萄味的萝卜
 * @date 2025/10/21 12:14
 *
 * 平台订单响应包装类
 *
 * 核心作用：统一各平台API响应格式，提供分页和状态信息
 * 设计目标：兼容不同平台的响应结构，提供统一处理接口
 *
 * 支持场景：
 * - 单页数据响应
 * - 分页数据响应
 * - 错误响应封装
 * - 空数据响应
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PlatformOrderResponse {
    /**
     * 响应是否成功
     * 作用：快速判断API调用结果，驱动重试机制
     */
    private boolean success;

    /**
     * 响应码 - 平台特定的响应代码
     * 作用：错误分类、问题诊断
     */
    private String code;

    /**
     * 响应消息 - 平台返回的描述信息
     * 作用：错误信息展示、日志记录
     */
    private String message;

    /**
     * 订单数据列表 - 解析后的标准订单列表
     * 作用：核心业务数据，传递给下游处理
     */
    private List<StandardOrderDto> orders;

    /**
     * 总记录数 - 用于分页场景
     * 作用：分页控制、数据统计
     */
    private Long totalCount;

    /**
     * 当前页码 - 分页查询的当前页
     * 作用：分页控制、续拉取定位
     */
    private Integer currentPage;

    /**
     * 每页大小 - 分页查询的页面大小
     * 作用：分页控制、性能优化
     */
    private Integer pageSize;

    /**
     * 是否有下一页 - 分页标识
     * 作用：驱动连续拉取，避免遗漏数据
     */
    private Boolean hasNext;

    /**
     * 原始响应数据 - 平台返回的原始响应体
     * 作用：问题排查、数据审计、重试处理
     */
    private String rawData;

    /**
     * 成功响应静态工厂方法
     */
    public static PlatformOrderResponse success(List<StandardOrderDto> orders) {
        return PlatformOrderResponse.builder()
                .success(true)
                .code("200")
                .message("SUCCESS")
                .orders(orders)
                .build();
    }

    /**
     * 分页成功响应静态工厂方法
     */
    public static PlatformOrderResponse success(List<StandardOrderDto> orders,
                                                long totalCount, int currentPage, int pageSize) {
        return PlatformOrderResponse.builder()
                .success(true)
                .code("200")
                .message("SUCCESS")
                .orders(orders)
                .totalCount(totalCount)
                .currentPage(currentPage)
                .pageSize(pageSize)
                .hasNext(currentPage * pageSize < totalCount)
                .build();
    }

    /**
     * 失败响应静态工厂方法
     */
    public static PlatformOrderResponse failure(String code, String message) {
        return PlatformOrderResponse.builder()
                .success(false)
                .code(code)
                .message(message)
                .build();
    }

    /**
     * 失败响应静态工厂方法（包含原始数据）
     */
    public static PlatformOrderResponse failure(String code, String message, String rawData) {
        return PlatformOrderResponse.builder()
                .success(false)
                .code(code)
                .message(message)
                .rawData(rawData)
                .build();
    }
}
